package com.atguigu.spzx.cart.manager;

import com.alibaba.fastjson.JSON;
import com.atguigu.spzx.cart.entity.CartItemRedis;
import com.atguigu.spzx.common.constant.RedisKeyConstant;
import com.atguigu.spzx.common.utils.AuthContextUtil;
import com.atguigu.spzx.common.utils.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * CartManager
 * </p>
 *
 * @author flyduck
 * @since 2023/11/6
 */
@Component
public class CartManager {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    private String getCartKey(Long userId) {
        //定义key user:cart:userId
        return RedisKeyConstant.CART_USER_ID_PREFIX + userId;
    }

    public CartItemRedis getCartItemRedisBySkuId(Long skuId){
        //获取用户id作为购物车的key
        Long userId = AuthContextUtil.getUserInfo().getId();
        String cartKey = getCartKey(userId);

        Object skuInfo = redisTemplate.opsForHash().get(cartKey, String.valueOf(skuId));

        CartItemRedis cartItemRedis = null;
        if(skuInfo != null){
            cartItemRedis = JSON.parseObject(skuInfo.toString(), CartItemRedis.class);
        }
        return cartItemRedis;
    }

    public void saveCartItemRedis(Long skuId,CartItemRedis cartItemRedis){
        //获取用户id作为购物车的key
        Long userId = AuthContextUtil.getUserInfo().getId();
        String cartKey = getCartKey(userId);

        redisTemplate.opsForHash().put(cartKey, String.valueOf(skuId) , JSON.toJSONString(cartItemRedis));
    }

    /**
     * 查询购物车列表
     * @return
     */
    public List<CartItemRedis> getCartItemList() {
        //获取用户id作为购物车的key
        Long userId = AuthContextUtil.getUserInfo().getId();
        String cartKey = getCartKey(userId);

        List<Object> valueList = redisTemplate.opsForHash().values(cartKey);
        if (CollectionUtils.isEmpty(valueList)) {
            return Collections.emptyList();
        }

        List<CartItemRedis> cartItemRedisList = valueList.stream()
                .map(value -> JSON.parseObject(value.toString(), CartItemRedis.class))
                .sorted((o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime()))
                .collect(Collectors.toList());
        return cartItemRedisList;
    }

    public void deleteCartItemBySkuId(Long skuId){
        //获取用户id作为购物车的key
        Long userId = AuthContextUtil.getUserInfo().getId();
        String cartKey = getCartKey(userId);

        redisTemplate.opsForHash().delete(cartKey, String.valueOf(skuId));
    }

    public Boolean existsBySkuId(Long skuId){
        //获取用户id作为购物车的key
        Long userId = AuthContextUtil.getUserInfo().getId();
        String cartKey = getCartKey(userId);
        return redisTemplate.opsForHash().hasKey(cartKey, String.valueOf(skuId));
    }

    /**
     * 更新购物车商品选中状态
     * @param skuId
     * @param isChecked
     */
    public void updateIsCheckedBySkuId(Long skuId, Integer isChecked) {
        if (existsBySkuId(skuId)) {
            CartItemRedis cartItemRedis = getCartItemRedisBySkuId(skuId);
            cartItemRedis.setIsChecked(isChecked);
            saveCartItemRedis(skuId, cartItemRedis);
        }

    }

    /**
     * 更新购物车商品选中状态
     * @param isChecked
     */
    public void updateIsChecked(Integer isChecked) {
        List<CartItemRedis> cartItemList = getCartItemList();
        for (CartItemRedis cartItemRedis : cartItemList) {
            cartItemRedis.setIsChecked(isChecked);
            saveCartItemRedis(cartItemRedis.getSkuId(),cartItemRedis);
        }

    }

    /**
     * 清空购物车
     */
    public void deleteCart() {
        //获取用户id作为购物车的key
        Long userId = AuthContextUtil.getUserInfo().getId();
        String cartKey = getCartKey(userId);
        redisTemplate.delete(cartKey);
    }
}
